#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

/**
 * C语言的未定义行为。
 * 简单地说，未定义行为是指C语言标准未做规定的行为，同时，这也意味着标准也没有要求编译器判断未定义行为。
 * 对于这类行为，不同的编译器可能会做出不一样的处理，所以不同的编译器会出现不同的结果。
 * 同时，即便是同一种编译器，在不同的CPU、操作系统下也可能会有不同的结果(因为编译器对每种环境的适配也不一定能保持一致)。
 * 所以什么都有可能发生，这是一个极大的隐患，所以我们应该尽量避免这种情况的发生。
 *
 * 这里尽可能举例常见的未定义行为避免踩坑。
 */
int main() {
    // 1、同一个表达式中存在多个运算符时，不确定编译器的计算顺序。所以结果并不一定按照我们的预想。
    int i = 7;
    printf("%d\n", i++ * i++);
    i = 7;
    printf("%d\n", ++i * ++i);

    // 2、函数各个参数的求值顺序不确定。
    int n = 1;
    printf("%d,%d\n", ++n, pow(2, n));

    return 0;

}